package y_2025.m11.d05;

import java.util.concurrent.atomic.AtomicInteger;

public class BankAccountWithCAS {
    private AtomicInteger balance = new AtomicInteger(100); // 使用原子整数
    
    // 安全的存款方法 - 使用 CAS
    public void deposit(int amount) {
        while (true) {
            int current = balance.get();           // 步骤1：读取当前余额
            int newBalance = current + amount;     // 步骤2：计算新余额
            
            // 步骤3：CAS操作 - 只有余额还是current时才更新为newBalance
            if (balance.compareAndSet(current, newBalance)) {
                break; // 更新成功，退出循环
            }
            // 如果更新失败（说明其他线程修改了余额），循环重试
        }
    }
    
    // 更简洁的写法
    public void depositSimple(int amount) {
        balance.addAndGet(amount); // 内部就是基于CAS实现的
    }
    
    public int getBalance() {
        return balance.get();
    }
    
    public static void main(String[] args) throws InterruptedException {
        BankAccountWithCAS account = new BankAccountWithCAS();
        
        // 创建10个线程，每个线程存10元钱
        Thread[] threads = new Thread[10];
        for (int i = 0; i < 10; i++) {
            threads[i] = new Thread(() -> {
                account.deposit(10);
            });
        }
        
        // 启动所有线程
        for (Thread t : threads) {
            t.start();
        }
        
        // 等待所有线程完成
        for (Thread t : threads) {
            t.join();
        }
        
        System.out.println("最终余额: " + account.getBalance());
        // 总是输出200元，不会出错
    }
}